#!/usr/bin/env python
# coding: utf-8

# 是一种集合算法：可以有效的防止过拟合，可以降低噪声干扰，提高模型的准确率和稳定性

# 少数服从多数,非常适用于特征重要性的场合，标准化后可以看到占比

# sklearns内置的随机森林函数中的超参数：

# 1.n_estimators超参数表示算法在进行最大投票或采取预测平均值之前建立的树数。一般来说，树的数量越多，性能越好，预测也越稳定

# 2.max_features它表示随机森林在单个树中可拥有的特征最大数量

# 3.min_sample_leaf决定了叶子的数量

# 4.n_jobs表示允许使用处理器的数量。若为1，则只能使用一个处理器。值为-1则表示没有限制

# In[3]:


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt


# In[4]:


data=pd.read_csv("./train.csv")  #同样用泰坦尼克的数据集，预处理步骤一样
data=data[['Survived', 'Pclass', 'Sex', 'Age','SibSp','Parch','Fare','Embarked']]


# In[5]:


data['Age']=data['Age'].fillna(data['Age'].mean())  #fillna()填充缺失值
data.fillna(0,inplace=True)
data['Sex']=[1 if x=='male' else 0 for x in data.Sex]


# In[6]:


data['P1']=np.array(data['Pclass']==1).astype(np.int32)
data['P2']=np.array(data['Pclass']==2).astype(np.int32)
data['P3']=np.array(data['Pclass']==3).astype(np.int32)  #独热编码
del data['Pclass']


# In[7]:


data['e1']=np.array(data['Embarked']=='S').astype(np.int32)
data['e2']=np.array(data['Embarked']=='C').astype(np.int32)
data['e3']=np.array(data['Embarked']=='Q').astype(np.int32)
del data['Embarked']


# In[8]:


data.values.dtype


# In[9]:


data_train=data[['Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'P1', 'P2', 'P3', 'e1', 'e2', 'e3']].values #特征
data_target=data['Survived'].values.reshape(-1,1)  #目标
np.shape(data_train),np.shape(data_target)  


# In[10]:


from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(data_train,data_target,test_size=0.2) #0.2代表82划分，训练值8成，测试值2成


# In[11]:


x_train.shape,x_test.shape


# In[12]:


from sklearn.ensemble import RandomForestClassifier  #引入随机森林分类器


# In[13]:


model=RandomForestClassifier(n_estimators=100,n_jobs=4)  #建立100颗树，4个处理器，初始化模型


# In[16]:


model.fit(x_train,y_train)  #训练模型


# In[17]:


model.score(x_test,y_test)  #得分


# In[18]:


model.feature_importances_  #各个特征的重要性


# In[27]:


for i,imp in zip(['Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'P1', 'P2', 'P3', 'e1', 'e2', 'e3'],model.feature_importances_):
    print(i,':',imp)  #查看各个特征重要性


# In[31]:


model.predict(x_test[0].reshape(1,-1))  #预测结局


# In[32]:


model.estimators_  #查看100颗决策树


# 交叉验证

# In[33]:


from sklearn.model_selection import GridSearchCV


# In[34]:


n_estimators=range(80,130)


# In[35]:


param_grid={'n_estimators':n_estimators} #参数


# In[37]:


model=GridSearchCV(RandomForestClassifier(),param_grid,cv=5)
model.fit(data_train,data_target) #这个是直接把x与y放进去，不用把划分的放进去，它会自动划分


# In[38]:


model.best_params_  #得出最好的参数，得分最高的参数与阈值


# In[40]:


model.best_score_  #得出最高分数


# In[ ]:




